package com.bjc.service.impl;

import com.bjc.po.User;
import com.bjc.utils.KeyNameUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @program: boot-lettuce
 * @description: 实现类
 * @author: bjc
 * @create: 2020-07-08 21:55
 */

@Service
@Slf4j
public class UserServiceImpl {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Resource(name = "redisTemplate")
    private ValueOperations<String,String> string; //等同于redisTemplate.opsForValue()

    @Resource(name = "redisTemplate") //K user HK id HV Object
    private HashOperations<String, String, User> hash;
    /**
     * Redis有什么命令 Jedis有什么方法
     * --》Lettuce--》RedisTemplate（Jedis/..）进一步的封装
     * RedisTemplate方法和命令肯定不一样
     *
     * Redis String类型
     * 需求： 用户输入一个key，
     * 先判断Redis中是否存在该数据，
     * 如果存在，在Redis中进行查询，并返回
     * 如果不存在，在mysql数据库查询，将结果赋给Redis，并返回
     */
    public String getString(String key){
        if (redisTemplate.hasKey(key)){//exists
            log.info("------->Redis中查询出来的：");
            //return (String)redisTemplate.opsForValue().get(key);
            return string.get(key);
        }else {
            String val = "RedisTemplate模板学习lettuce客户端";
            log.info("------->Mysql中查询出来的："+val);
            //redisTemplate.opsForValue().set(key,val);
            string.set(key,val);
            log.info("------->Mysql中查询结果存入Redis中");
            return val;
        }


//        System.out.println(redisTemplate);
//        log.info("RedisTemplate-->测试");
//        return null;
    }


    /**
     * 测试String类型
     * 需求：用户输入一个redis数据，该key的有效期为28小时
     */
    public void expireStr(String key,String value){
        redisTemplate.opsForValue().set(key,value);
        redisTemplate.expire(key,2, TimeUnit.HOURS);
    }

    //TODO Hash类型

    /**
     * 测试Hash类型  演示
     * @param id
     * @return
     */
    public User selectById(String id){
        User user = new User();
        //user:id  user:1  user:2
        if (redisTemplate.opsForHash().hasKey(User.getKeyName(),id)){
            log.info("------>查询Redis数据");
            //return (User)redisTemplate.opsForHash().get(KeyNameUtil.USER,id);
            return hash.get(User.getKeyName(),id);
        }else {
            log.info("----->查询mysql数据库");
            user.setId(id);
            user.setName("陈梦");
            user.setAge(22);
            /**
             * @param h 用户实体  user
             * @param HK 用户主键 id
             * @param hv 整个对象
             */
            //redisTemplate.opsForHash().put("user",id,user);
            hash.put(User.getKeyName(),id,user);
            return user;
        }
    }

    /**
     * 问题1：出现了很多相同的字符串  ---》提取出来
     *  答1：声明一个工具类
     *  答2：在实体Bean声明一个方法
     * 问题2：强制类型转换问题？
     * 问题3：redisTemplate.opsForHash()写很长一串？
     *  答：
     */

}
